#!/usr/bin/env bun

/**
 * 自动生成 .env.example 脚本
 * 该脚本读取 src/config/schema.ts 中的配置定义，
 * 根据规则生成 .env.example 文件
 */

import { ConfigSchema } from '@/config/schema.js';

const buffer: string[] = [];

buffer.push(`# 环境变量配置示例
# 复制此文件为 .env 并根据需要修改配置值
`);

// 按分组组织配置项
// oxlint-disable-next-line no-explicit-any
const groupedConfigs = new Map<string, Array<{ key: string; value: any }>>();

for (const [key, value] of Object.entries(ConfigSchema.shape)) {
  // @ts-ignore
  const tag = value.meta().tag ?? '其他配置';
  if (!groupedConfigs.has(tag)) {
    groupedConfigs.set(tag, []);
  }
  groupedConfigs.get(tag)!.push({ key, value });
}

// 决定 = 长度
const maxKeyLength = Math.max(30, ...Array.from(groupedConfigs.keys()).map(tag => tag.length + 10));
const equalsString = '='.repeat(maxKeyLength);

// 按分组顺序输出
for (const [tag, configs] of groupedConfigs) {
  buffer.push(`\n# ${equalsString}
# ${tag}
# ${equalsString}
`);

  for (const { key, value } of configs) {
    let placeholder = value._def.prefaultValue ?? value._def.defaultValue;
    if (placeholder === undefined) {
      buffer.push(`# ${value.description ?? key + ' 配置'}\n#${key}=\n`);
      continue;
    }
    if (typeof placeholder === 'object') {
      if (placeholder === null) {
        placeholder = 'null';
      } else if (placeholder instanceof RegExp) {
        placeholder = placeholder.toString();
      } else if (placeholder instanceof Date) {
        placeholder = placeholder.toISOString();
      } else if (Array.isArray(placeholder)) {
        placeholder = placeholder.join(',');
      } else {
        placeholder = JSON.stringify(placeholder);
      }
    }
    const p = String(placeholder);
    buffer.push(
      `# ${value.description ?? key + ' 配置'}\n${key}=${
        p
          .split('')
          .some(ch => ch === ' ' || ch === '\n' || ch === '\t' || ch === '\r' || ch === '#')
          ? JSON.stringify(p)
          : p
      }\n`
    );
  }
}

await Bun.file('.env.example').write(buffer.join(''));
